package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strings"
)

func main() {
	//flag.Parse() // 解析命令参数
	//if flag.NArg() == 0 {
	//	// 如果没有参数默认从标准输入读取内容
	//	cat(bufio.NewReader(os.Stdin))
	//}
	//// 依次读取每个指定文件的内容并打印到终端
	//for i := 0; i < flag.NArg(); i++ {
	//	f, err := os.Open(flag.Arg(i))
	//	if err != nil {
	//		fmt.Fprintf(os.Stdout, "reading from %s failed, err:%v \n", flag.Arg(i), err)
	//		continue
	//	}
	//	cat(bufio.NewReader(f))
	//}

	//_, err := CopyFile("/Users/zhoutao/project/go-study/cmd/test/dst.txt", "/Users/zhoutao/project/go-study/cmd/test/src.txt")
	//if err != nil {
	//    fmt.Printf("copy file failed, err:%v \n", err)
	//	return
	//}
	//fmt.Printf("copy done!")

	files, _ := TraverseDir("/Users/zhoutao/Downloads/20190_627979_1")
	for _, file := range files {
	    fmt.Println(file)
	    err := AppendToFile(file,"/Users/zhoutao/Downloads/20190_627979_1.json")
	    if err != nil {
	       fmt.Println("file copy failed, err:"+err.Error())
	    }
	}
}

// cat 命令实现
func cat(r *bufio.Reader) {
	for {
		buf, err := r.ReadBytes('\n')
		if err == io.EOF {
			// 退出前将已读到的内容输出
			fmt.Fprintf(os.Stdout, "%s", buf)
			break
		}
		fmt.Fprintf(os.Stdout, "%s", buf)
	}
}

// CopyFile 拷贝文件函数
func CopyFile(dstName, srcName string) (written int64, err error) {
	// 以读的方式打开源文件
	src, err := os.Open(srcName)
	if err != nil {
		fmt.Printf("open %s failed, err:%v \n", srcName, err)
		return
	}
	defer src.Close()
	// 以写|创建的方式打开目标文件
	dst, err := os.OpenFile(dstName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Printf("oepn %s failed, err:%v \n", dstName, err)
		return
	}
	defer dst.Close()
	return io.Copy(dst, src) // 调用io.Copy拷贝内容
}

// TraverseDir 递归读取目录，输出目录下所有的文件路径
func TraverseDir(dirPath string) ([]string, error) {
	dir, err := ioutil.ReadDir(dirPath)
	if err != nil {
	    return nil, err
	}

	var files []string
	pathSep := string(os.PathSeparator)
	for _, file := range dir {
		if file.IsDir() {
		    // 递归读取目录
			TraverseDir(dirPath+pathSep+file.Name())
		} else {
			files = append(files, dirPath+pathSep+file.Name())
		}
	}

	return files, nil
}

// AppendToFile 文件追加
func AppendToFile(dstName, srcName string) error {
	dstFile, err := os.Open(dstName)
	if err != nil {
		return err
	}
	defer dstFile.Close()

	// 要写入的目标文件
	f, err := os .OpenFile(srcName, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0660)
	if err != nil {
	    return err
	}
	defer f.Close()

	reader := bufio.NewReader(dstFile)
	for {
		line, err := reader.ReadString('\n') // 读取换行字符
		if err == io.EOF {
		    if len(line) != 0 {
		        f.WriteString(line+"\n")
		    }
		    // 文件读完了
		    break
		}
		if err != nil {
		    return err
		}
		f.WriteString(line)
	}

	return nil
}

/*
你有50枚金币，需要分配给以下几个人：Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。
分配规则如下：
a. 名字中每包含1个'e'或'E'分1枚金币
b. 名字中每包含1个'i'或'I'分2枚金币
c. 名字中每包含1个'o'或'O'分3枚金币
d: 名字中每包含1个'u'或'U'分4枚金币
写一个程序，计算每个用户分到多少金币，以及最后剩余多少金币？
程序结构如下，请实现 ‘dispatchCoin’ 函数
*/
var (
	coins = 50
	users = []string{
		"Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
	}
	distribution = make(map[string]int, len(users))
)

func dispatchCoin() int {
	var sum, temp int
	for _, v := range users {
		temp = 0
		if strings.ContainsAny(v, "e&E") {
			temp += strings.Count(v, "e") + strings.Count(v, "E")
		}

		if strings.ContainsAny(v, "i&I") {
			temp += strings.Count(v, "i")*2 + strings.Count(v, "I")*2
		}

		if strings.ContainsAny(v, "o&O") {
			temp += strings.Count(v, "o")*3 + strings.Count(v, "O")*3
		}

		if strings.ContainsAny(v, "u&U") {
			temp += strings.Count(v, "u")*4 + strings.Count(v, "U")*4
		}
		distribution[v] = temp
		sum += temp
	}

	return coins - sum
}
